Invariant (不変条件)
値同士の間にある必ず満たすべき不変な条件
型で表せるものとそうでないものとある
どうやるか
smart constructorを使用する
データはimmutableなので、作成時にのみvalidationすれば十分にIntegrityは保証される
primitiveでは同じ型の値も型レベルで異なるものとして扱う
newtypeなど
型で表せるものの例
「Orderは必ず1つ以上のOrderLineを持つ」
OrderLines :: NotEmptylist<OrderLine>という型にする
型で表せないものの例
「UnitQuantityは、1~1000の間の値を取る」
普通はsmart constructorとかで対応すると思う
参考
/mrsekut-book-4048931164/115: 6.3 型システムによる不変条件の強制~